package com.shop.cereshop.app.tencent.im.callback.impl;

import com.alibaba.fastjson2.JSON;
import com.shop.cereshop.app.tencent.im.callback.TimCallbackHandler;
import com.shop.cereshop.commons.tencent.im.model.callback.request.AfterSendMsgCallbackRequest;
import com.shop.cereshop.commons.tencent.im.model.callback.response.CallbackResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import static com.shop.cereshop.commons.tencent.im.constant.CallbackCommand.C2C_CALLBACK_AFTER_SEND_MSG;

/**
 * @description: 发单聊消息之后回调处理器,处理 C2C.CallbackAfterSendMsg,注意：此回调即使消息发送失败（如被过滤）也会触发。
 * @author zdd
 * @date 2025/9/11 10:29
 * @version 1.0
 */
@Slf4j
@Service
public class AfterSendMsgCallbackImpl implements TimCallbackHandler<AfterSendMsgCallbackRequest> {

    @Override
    public String getCommand() {
        return C2C_CALLBACK_AFTER_SEND_MSG;
    }

    // 如果需要异步处理耗时任务，可以注入 TaskExecutor
    // @Autowired
    // private AsyncTaskExecutor asyncTaskExecutor;

    @Override
    public CallbackResponse handle(AfterSendMsgCallbackRequest request) {
        log.info("发单聊消息之后回调: From={}, To={}, MsgKey={}, SendResult={}, EventTime={}",
                request.getFromAccount(), request.getToAccount(), request.getMsgKey(),
                request.getSendMsgResult(), request.getEventTime());
        log.info("开始处理. request: {}", JSON.toJSONString(request));
        try {
//            // 记录消息日志 (无论成功失败)
//            logMessage(request);
//
//            // 数据统计 (例如更新用户发消息数、接收消息数)
//            updateStatistics(request);
//
//            // 如果消息发送失败，可能需要告警或特殊处理
//            if (request.getSendMsgResult() != 0) {
//                handleSendFailure(request);
//            }

            // 同步到其他系统 (推荐异步)
            // syncToOtherSystemAsync(request);

            // 处理成功
            log.info("发单聊消息之后回调处理成功. MsgKey: {}", request.getMsgKey());
            return CallbackResponse.success();
        } catch (Exception e) {
            log.error("发单聊消息之后回调处理失败. MsgKey: " + request.getMsgKey(), e);
            return CallbackResponse.error("Internal server error: " + e.getMessage());
        }

    }

    /**
     * 记录消息日志
     */
    private void logMessage(AfterSendMsgCallbackRequest request) {
        // 实际生产中，这里可能写入数据库、发送到消息队列、或写入文件日志
        log.debug("发单聊消息之后回调: {}", request);
        // asyncTaskExecutor.execute(() -> complexLogProcessing(request));
    }

    /**
     * 更新统计数据
     */
    private void updateStatistics(AfterSendMsgCallbackRequest request) {
        // 更新数据库中的计数器
        // statisticsService.incrementUserMessageCount(request.getFromAccount(), 1);
        // statisticsService.incrementUserReceivedCount(request.getToAccount(), 1);
        log.debug("正在更新消息的统计信息: {}", request.getMsgKey());
    }

    /**
     * 处理消息发送失败的情况
     */
    private void handleSendFailure(AfterSendMsgCallbackRequest request) {
        log.warn("消息发送失败. MsgKey: {}, Error: {}", request.getMsgKey(), request.getErrorInfo());
        // 可以发送告警邮件、短信，或记录到专门的失败日志表
        // alertService.sendAlert("IM Message Send Failed: " + request.getMsgKey() + ", Error: " + request.getErrorInfo());
    }

    /**
     * 异步同步到其他系统
     * 使用 @Async 注解需要在 Spring Boot 主类或配置类上启用 @EnableAsync
     */
    // @Async
    // public void syncToOtherSystemAsync(AfterSendMsgCallbackRequest request) {
    //     try {
    //         // 调用其他系统的 API 或发送消息到 MQ
    //         otherSystemService.syncMessage(request);
    //     } catch (Exception e) {
    //         log.error("无法将消息异步同步到其他系统. MsgKey: " + request.getMsgKey(), e);
    //         // 异步任务中的错误需要单独处理，避免影响主流程
    //     }
    // }


}
